Закладки.отд
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 
(*~\Глагол\Отделы\Поле~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                        ОТДЕЛ Закладки;
(*============================================================================*
 * НАЗНАЧЕНИЕ: закладки на холсты в главном окне
 *============================================================================*)
ИСПОЛЬЗУЕТ 
  Рамка,
  Надел,
  Поле,
  Холст,
  ОС     ИЗ "..\Обмен\",
  ЦвЗнак ИЗ "..\Обмен\",
  Окно   ИЗ "..\Обмен\",
  Файл   ИЗ "..\Обмен\",
  Ввод   ИЗ "..\Обмен\";
ПОСТ
  Закладок = 30; (* всего может быть закладок *)
  (* цвет *)
  цРамка    = 1BX;
  цОткрытая = 1FX;
  цЗакрытая = 17X;
  цРКнопка  = 1FX;
  цНКнопка  = 17X;
ВИД
  Доступ-=ДОСТУП К Вид;
  Вид-=НАБОР(Надел.Вид)
    закладок:ЦЕЛ;        (* используется закладок *)
    открытая:ЦЕЛ;        (* номер открытой закладки *)
    первая:ЦЕЛ;          (* первая видимая закладка *)
    холст-:Холст.Доступ; (* открытый холст *)
    холсты:РЯД Закладок ИЗ Холст.Доступ;
    естьПраваяКнопка,естьЛеваяКнопка:КЛЮЧ; 
    былаОшибка:КЛЮЧ;     (* в нижней строке отображается сообщение об ошибке *)
  КОН;
ПЕР
  (* составные постоянные *)
  пОткрытыйПробел:ЦвЗнак.Вид; 
  пЗакрытыйПробел:ЦвЗнак.Вид; 
  пВертЧерта     :ЦвЗнак.Вид; 
  пГорЧерта      :ЦвЗнак.Вид; 
  пПНУгол        :ЦвЗнак.Вид; 
  пЛНУгол        :ЦвЗнак.Вид; 
  пНУглы         :ЦвЗнак.Вид; 
  пЧерта         :ЦвЗнак.Строка;

(******************************************************************************)
ЗАДАЧА ПодготовитьПостоянные;
ПЕР
  поз:ЦЕЛ;
УКАЗ
  ЦвЗнак.ИзЗнакаИЦвета(" ",цЗакрытая,пЗакрытыйПробел);
  ЦвЗнак.ИзЗнакаИЦвета(" ",цОткрытая,пОткрытыйПробел);
  ЦвЗнак.ИзЗнакаИЦвета(2502X,цРамка,пВертЧерта);
  ЦвЗнак.ИзЗнакаИЦвета(2500X,цРамка,пГорЧерта);
  ЦвЗнак.ИзЗнакаИЦвета(2518X,цРамка,пПНУгол);
  ЦвЗнак.ИзЗнакаИЦвета(2514X,цРамка,пЛНУгол);
  ЦвЗнак.ИзЗнакаИЦвета(2534X,цРамка,пНУглы);
  ОТ поз:=0 ДО РАЗМЕР(пЧерта)-1 ВЫП
    пЧерта[поз]:=пГорЧерта
  КОН
КОН ПодготовитьПостоянные;

(******************************************************************************)
ЗАДАЧА ОтрисовкаЗаголовка(закладки:Доступ);
ПЕР
  верх,низ:ЦвЗнак.Строка; (* для ускорения вывода *)
  знак,цвет:ЗНАК;
  поз:ЦЕЛ;
  закладка:ЦЕЛ;
  послк:ЦЕЛ; (* последняя колонка *)
  к:ЦЕЛ;     (* обрабатываемая колонка (0..послк) *)
  лк,пк,вс,нс:ЦЕЛ;
УКАЗ
  лк:=закладки.лк;
  пк:=закладки.пк;
  вс:=закладки.вс;
  нс:=вс+1;
  послк:=пк-лк-2;
  низ:=пЧерта;
  (* место под кнопки *)
  верх[0]:=пВертЧерта;
  низ[0]:=пНУглы;
  верх[послк]:=пВертЧерта;
  низ[послк]:=пНУглы;
  (* существование кнопок *)
  закладки.естьЛеваяКнопка:=ОТКЛ;
  закладки.естьПраваяКнопка:=ОТКЛ;
  ЕСЛИ закладки.первая > 0 ТО
    закладки.естьЛеваяКнопка:=ВКЛ
  КОН;
  (* для всех видимых закладок *)
  к:=0;     
  закладка:=закладки.первая;
  КОЛЬЦО
    ЕСЛИ (закладка >= закладки.закладок) ИЛИ (к >= послк) ТО
      ВЫХОД
    КОН;
    (* передний разделитель *)
    верх[к]:=пВертЧерта;
    ЕСЛИ закладка = закладки.открытая ТО
      низ[к]:=пПНУгол
    ИНАЧЕ
      ЕСЛИ закладка-1 = закладки.открытая ТО
        низ[к]:=пЛНУгол
      ИНАЧЕ
        низ[к]:=пНУглы
      КОН
    КОН;
    УВЕЛИЧИТЬ(к);
    (* текст *)
    поз:=0;
    КОЛЬЦО
      ЕСЛИ поз >= ДЛИНА(закладки.холсты[закладка].имя) ТО 
        ВЫХОД 
      КОН;
      ЕСЛИ к >= послк ТО 
        закладки.естьПраваяКнопка:=ВКЛ;
        ВЫХОД 
      КОН;
      знак:=закладки.холсты[закладка].имя[поз];
      ЕСЛИ закладка = закладки.открытая ТО
        ЦвЗнак.ИзЗнакаИЦвета(знак,цОткрытая,верх[к]);
        низ[к]:=пОткрытыйПробел
      ИНАЧЕ
        ЦвЗнак.ИзЗнакаИЦвета(знак,цЗакрытая,верх[к])
      КОН;
      УВЕЛИЧИТЬ(к);
      УВЕЛИЧИТЬ(поз)
    КОН;
    УВЕЛИЧИТЬ(закладка)
  КОН;
  (* задний разделитель *)
  верх[к]:=пВертЧерта;
  ЕСЛИ закладка-1 = закладки.открытая ТО
    низ[к]:=пЛНУгол
  ИНАЧЕ
    низ[к]:=пНУглы
  КОН;
  УВЕЛИЧИТЬ(к);
  (* свободное место *)
  ПОКА к < послк ВЫП
    верх[к]:=пЗакрытыйПробел;
    УВЕЛИЧИТЬ(к)
  КОН;
  (* кнопки *)
  ЕСЛИ закладки.естьЛеваяКнопка ТО
    цвет:=цРКнопка
  ИНАЧЕ
    цвет:=цНКнопка
  КОН;
  Окно.ПисатьЦвет(вс,лк,цвет);
  Окно.ПисатьЗнак(вс,лк,25C4X);
  Окно.ПисатьЦвет(нс,лк,цРамка);
  Окно.ПисатьЗнак(нс,лк,2500X);
  ЕСЛИ закладки.естьПраваяКнопка ТО
    цвет:=цРКнопка
  ИНАЧЕ
    цвет:=цНКнопка
  КОН;
  Окно.ПисатьЦвет(вс,пк,цвет);
  Окно.ПисатьЗнак(вс,пк,25BAX);
  Окно.ПисатьЦвет(нс,пк,цРамка);
  Окно.ПисатьЗнак(нс,пк,2500X);
  (* вывод *)
  Окно.ПисатьСтроку(верх,вс,лк+1,послк+1);
  Окно.ПисатьСтроку(низ,нс,лк+1,послк+1)
КОН ОтрисовкаЗаголовка;

(******************************************************************************)
ЗАДАЧА ОтрисовкаОткрытой(закладки:Доступ);
ПЕР
  отрисовка:Поле.Отрисовка;
  холст:Холст.Доступ;
УКАЗ
  ЕСЛИ закладки.закладок = 0 ТО 
    Окно.РазмерУказки(0);
    закладки.холст:=ПУСТО;
    Окно.ЦветнойПробел(закладки.вс+2,закладки.лк,закладки.нс,закладки.пк,Надел.цХолста)
  ИНАЧЕ
    холст:=закладки.холсты[закладки.открытая];
    Рамка.Выставить(холст,закладки.поле);
    холст.Приём(холст,отрисовка);
    закладки.холст:=холст
  КОН
КОН ОтрисовкаОткрытой;

(******************************************************************************)
ЗАДАЧА ВыровнятьПервую(закладки:Доступ);
ПЕР
  длина:ЦЕЛ;
  первая:ЦЕЛ;
УКАЗ
  ЕСЛИ закладки.закладок = 0 ТО ВОЗВРАТ КОН;
  ЕСЛИ закладки.первая > закладки.открытая ТО
    закладки.первая:=закладки.открытая
  ИНАЧЕ
    длина:=закладки.пк-закладки.лк-4;
    первая:=закладки.открытая;
    ПОКА длина > 0 ВЫП
      ЕСЛИ первая = закладки.первая ТО ВОЗВРАТ КОН;
      УМЕНЬШИТЬ(длина,ДЛИНА(закладки.холсты[первая].имя)+1);
      УМЕНЬШИТЬ(первая)
    КОН;
    закладки.первая:=первая+1
  КОН
КОН ВыровнятьПервую;

(******************************************************************************)
ЗАДАЧА НажатаМышка(закладки:Доступ; км:ЦЕЛ);
ПЕР
  к,пк,закладка:ЦЕЛ;
УКАЗ
  пк:=закладки.пк-закладки.лк;
  ЕСЛИ  км <= 1 ТО
    ЕСЛИ закладки.естьЛеваяКнопка ТО
      УМЕНЬШИТЬ(закладки.первая)
    КОН
  АЕСЛИ км >= пк-1 ТО
    ЕСЛИ закладки.естьПраваяКнопка ТО
      УВЕЛИЧИТЬ(закладки.первая)
    КОН
  ИНАЧЕ
    закладка:=закладки.первая;
    к:=1;
    КОЛЬЦО
      ЕСЛИ (закладка >= закладки.закладок) ИЛИ (к >= пк-1) ТО
        ВЫХОД
      КОН;
      УВЕЛИЧИТЬ,ДЛИНА(закладки.холсты[закладка].имя)+1);
      ЕСЛИ км <= к ТО
        закладки.открытая:=закладка;
        ОтрисовкаОткрытой(закладки);
        ВЫХОД
      КОН;
      УВЕЛИЧИТЬ(закладка)
    КОН
  КОН;
  ОтрисовкаЗаголовка(закладки)
КОН НажатаМышка;

(******************************************************************************)
ЗАДАЧА Приём(надел:Надел.Доступ; посылка+:Ввод.Посылка);
ПЕР
  закладки:Доступ;

  ЗАДАЧА ПриёмУХолста;
  ПЕР
    холст:Холст.Доступ;
  УКАЗ
    холст:=закладки.холст;
    ЕСЛИ холст # ПУСТО ТО
      холст.Приём(холст,посылка)
    КОН
  КОН ПриёмУХолста;

УКАЗ
  закладки:=надел(Доступ);
  ЕСЛИ закладки.былаОшибка ТО
    ОтрисовкаОткрытой(закладки);
    закладки.былаОшибка:=ОТКЛ
  КОН;
  ДЛЯ посылка ВИДА
  | Поле.Отрисовка:
      ОтрисовкаЗаголовка(закладки);
      ОтрисовкаОткрытой(закладки)
  | Ввод.ОтМышки:
      ЕСЛИ посылка.с < 2 ТО
        ЕСЛИ посылка.события = {} ТО
          НажатаМышка(закладки,посылка.к)
        КОН
      ИНАЧЕ
        УМЕНЬШИТЬ(посылка.с,2);
        ПриёмУХолста
      КОН
  ИНАЧЕ
    ПриёмУХолста
  КОН
КОН Приём;

(******************************************************************************)
ЗАДАЧА Открыть-(закладки:Доступ; оИмяФ-:Файл.ВПолного);
(* открывает закладку на холст с заданным именем файла *)
ПЕР
  имяФ:Файл.ВПолного;
  холст:Холст.Доступ;
  закладка:ЦЕЛ;
УКАЗ
  ОС.МестоФ(оИмяФ,имяФ);
  (* может закладка с таким именем файла уже существует *)
  ОТ закладка:=0 ДО закладки.закладок-1 ВЫП
    ЕСЛИ закладки.холсты[закладка].имяФ = имяФ ТО
      закладки.открытая:=закладка;
      ОтрисовкаЗаголовка(закладки);
      ОтрисовкаОткрытой(закладки);
      ВОЗВРАТ
    КОН
  КОН;
  (* создаём новую закладку *)
  ЕСЛИ закладки.закладок >= Закладок ТО ВОЗВРАТ КОН;
  холст:=Холст.СоздатьИзФайла(2,0,-1,0,имяФ);
  (* сажаем холст на наше поле *)
  холст.поле:=закладки.поле;
  холст.состояние:=Надел.сВыбран; 
  (* добавляем холст в закладки *)
  закладки.холсты[закладки.закладок]:=холст;
  закладки.открытая:=закладки.закладок;
  УВЕЛИЧИТЬ(закладки.закладок);
  ОтрисовкаОткрытой(закладки);
  ВыровнятьПервую(закладки);
  ОтрисовкаЗаголовка(закладки)
КОН Открыть;

(******************************************************************************)
ЗАДАЧА Удалить-(закладки:Доступ);
(* удаляет открытую закладку *)
ПЕР
  закладка,открытая:ЦЕЛ;
УКАЗ
  ЕСЛИ закладки.закладок = 0 ТО ВОЗВРАТ КОН;
  УМЕНЬШИТЬ(закладки.закладок);
  открытая:=закладки.открытая;
  ОТ закладка:=открытая ДО закладки.закладок-1 ВЫП
    закладки.холсты[закладка]:=закладки.холсты[закладка+1]
  КОН;
  ЕСЛИ открытая = закладки.закладок ТО
    УМЕНЬШИТЬ(закладки.открытая)
  КОН;
  ОтрисовкаОткрытой(закладки);
  ВыровнятьПервую(закладки);
  ОтрисовкаЗаголовка(закладки)
КОН Удалить;

(******************************************************************************)
ЗАДАЧА Следующая-(закладки:Доступ);
(* выбор следующей закладки *)
УКАЗ
  ЕСЛИ закладки.закладок = 0 ТО ВОЗВРАТ КОН;
  УВЕЛИЧИТЬ(закладки.открытая);
  ЕСЛИ закладки.открытая >= закладки.закладок ТО
    закладки.открытая:=0
  КОН;
  ВыровнятьПервую(закладки);
  ОтрисовкаЗаголовка(закладки);
  ОтрисовкаОткрытой(закладки)
КОН Следующая;

(******************************************************************************)
ЗАДАЧА СИзменениями-(закладки:Доступ):КЛЮЧ;
(* Есть изменённые холсты? *)
ПЕР
  закладка:ЦЕЛ;
УКАЗ
  ОТ закладка:=0 ДО закладки.закладок-1 ВЫП
    ЕСЛИ закладки.холсты[закладка].изменён = "*" ТО
      ВОЗВРАТ ВКЛ
    КОН
  КОН;
  ВОЗВРАТ ОТКЛ
КОН СИзменениями;

(******************************************************************************)
ЗАДАЧА СохранитьИзменённые-(закладки:Доступ);
ПЕР
  закладка:ЦЕЛ;
  холст:Холст.Доступ;
УКАЗ
  ОТ закладка:=0 ДО закладки.закладок-1 ВЫП
    холст:=закладки.холсты[закладка];
    ЕСЛИ холст.изменён = "*" ТО
      ЕСЛИ Холст.СохранитьВФайл(холст) ТО КОН
    КОН
  КОН
КОН СохранитьИзменённые;

(******************************************************************************)
ЗАДАЧА Создать-(верх,лево,строк,колонок:ЦЕЛ):Доступ;
ПЕР
  закладки:Доступ;
УКАЗ
  СОЗДАТЬ(закладки);
  Надел.Подготовить(закладки,верх,лево,строк,колонок,{Надел.прВыбираемый},Приём);
  ВОЗВРАТ закладки
КОН Создать;

(******************************************************************************)
ЗАДАЧА ВыводОшибки-(закладки:Доступ; имяФ-:Файл.ВПолного; с,к:ЦЕЛ; текст-:ЦЕПЬ);
ПЕР
  нс,лк,пк:ЦЕЛ;
УКАЗ
  Открыть(закладки,имяФ);
  ЕСЛИ закладки.закладок = 0 ТО ВОЗВРАТ КОН;
  Холст.ВыставитьУказку(закладки.холст,с-1,к-1);
  нс:=закладки.нс;
  лк:=закладки.лк;
  пк:=закладки.пк;
  Окно.ЦветнойПробел(нс,лк,нс,пк,Надел.цПредупреждения);
  Окно.Цепь(нс,лк,нс,пк,текст);
  закладки.былаОшибка:=ВКЛ
КОН ВыводОшибки;

(******************************************************************************)
УКАЗ
  ПодготовитьПостоянные
КОН Закладки.

 
 


Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com

 
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы